"""
格式转换工具：实现不同格式之间的转换（中介模式）
支持从任何格式导入，导出为任何格式
"""
from __future__ import annotations

from pathlib import Path
from typing import Optional
import tempfile
import shutil

from .domain import ProjectSnapshot
from .enums import IOFormat
from .strategies.base import ImportStrategy, ExportStrategy, ExportResult
from .services.importer import IMPORT_STRATEGIES, UnknownImportFormatError
from .services.exporter import EXPORT_STRATEGIES, UnknownExportFormatError


class FormatConverter:
    """格式转换器：实现不同格式之间的转换"""
    
    @staticmethod
    def convert(
        input_path: Path,
        input_format: IOFormat,
        output_format: IOFormat,
        output_dir: Optional[Path] = None
    ) -> ExportResult:
        """
        将文件从一种格式转换为另一种格式
        
        Args:
            input_path: 输入文件路径
            input_format: 输入格式
            output_format: 输出格式
            output_dir: 输出目录（可选，默认使用临时目录）
        
        Returns:
            ExportResult: 导出结果，包含文件路径和MIME类型
        
        Raises:
            UnknownImportFormatError: 不支持的导入格式
            UnknownExportFormatError: 不支持的导出格式
        """
        # 1. 获取导入策略
        import_strategy_cls = IMPORT_STRATEGIES.get(input_format)
        if not import_strategy_cls:
            raise UnknownImportFormatError(f"不支持的导入格式: {input_format.value}")
        
        # 2. 获取导出策略
        export_strategy_cls = EXPORT_STRATEGIES.get(output_format)
        if not export_strategy_cls:
            raise UnknownExportFormatError(f"不支持的导出格式: {output_format.value}")
        
        # 3. 导入：从文件读取为ProjectSnapshot
        import_strategy = import_strategy_cls()
        snapshot = import_strategy.import_snapshot(input_path)
        
        # 4. 导出：将ProjectSnapshot导出为目标格式
        # 如果指定了输出目录，使用它；否则使用临时目录
        if output_dir:
            final_output_dir = output_dir
            final_output_dir.mkdir(parents=True, exist_ok=True)
        else:
            # 使用临时目录
            final_output_dir = Path(tempfile.mkdtemp())
        
        # 创建导出策略实例，传入输出目录
        export_strategy = export_strategy_cls(output_dir=final_output_dir)
        
        # 5. 执行导出
        result = export_strategy.export(snapshot)
        
        return result
    
    @staticmethod
    def get_supported_import_formats() -> list[IOFormat]:
        """获取所有支持的导入格式"""
        return list(IMPORT_STRATEGIES.keys())
    
    @staticmethod
    def get_supported_export_formats() -> list[IOFormat]:
        """获取所有支持的导出格式"""
        return list(EXPORT_STRATEGIES.keys())
    
    @staticmethod
    def get_format_info(format_type: IOFormat, is_export: bool = True) -> dict:
        """
        获取格式信息
        
        Args:
            format_type: 格式类型
            is_export: True表示导出格式，False表示导入格式
        
        Returns:
            格式信息字典
        """
        if is_export:
            strategy_cls = EXPORT_STRATEGIES.get(format_type)
        else:
            strategy_cls = IMPORT_STRATEGIES.get(format_type)
        
        if not strategy_cls:
            return {}
        
        # 使用类方法获取格式信息，不需要实例化
        format_info = strategy_cls.get_format_info()
        
        # 统一处理：如果只有extension（单数），转换为extensions（复数）列表
        if "extension" in format_info and "extensions" not in format_info:
            format_info["extensions"] = [format_info["extension"]]
        
        return format_info

